Veri manipulasyonu, veriyi amaca yonelik okunabilir ve düzenli hale getirmektir.Yapilari parca parca,anlasilabilir,okunabilir ve basit bir sekilde ifade etme yaklasiminda olmaliyiz.

Tidy Tools Manifestosu 4 Prensibi

. Mumkun oldugu kadar var olan veri yapilarini kullan.

. Pipe ile basit fonksiyonlar olustur:Buyuk problemleri kucuk parcalara ayirarak coz.

. Fonksiyonel programlamayı benimse.

. Insanlar icin tasarla: Temiz ve okunabilir kod yaz.

Pipe Operatoru ( %>%)

. Karmasik islemleri birbirine baglamak.

. Kendisinden onceki yapinin ciktisini, kendisinden bir sonraki yapiya girdi olarak atanmasini saglamaktadir.

dplyr Nedir ?

Bir pense veya ingiliz anahtari esprisinden yola cikarak dusunebiliriz.Veri manipulasyonun grameri olarak adlandirilmistir.Veri manipulasyonu, veri gorsellestirme ve kesifci veri analizi gibi konularda kullanilmaktadir.

Tidy Data

Tidy Data, her bir satir elemaninin gozlem birimini, her bir sutun elemaninin da degiskeni temsil ettigi veri tipidir.

Satir –> Gozlem

Sutun –> Degisken

tidyr

. gather()

. spread()

. seperate()

. unite()


select() : degisken secimi

filter() : gozlem secimi

mutate() : degisken olusturma

summarise() : ozet istatistikler

group_by() : gruplama

left_join() : birlestirme islemleri

summarise() : veri ozetleme


Veri Seti

nycflights13 - New York City’e ait 2013 yilinin ucus verileri

# Kutuphane icerisinden veri seti secme ve dataframe olarak atama

library(dplyr)
## Warning: package 'dplyr' was built under R version 4.0.5
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(nycflights13)
## Warning: package 'nycflights13' was built under R version 4.0.5
df <- flights

df
str(df)
## tibble[,19] [336,776 x 19] (S3: tbl_df/tbl/data.frame)
##  $ year          : int [1:336776] 2013 2013 2013 2013 2013 2013 2013 2013 2013 2013 ...
##  $ month         : int [1:336776] 1 1 1 1 1 1 1 1 1 1 ...
##  $ day           : int [1:336776] 1 1 1 1 1 1 1 1 1 1 ...
##  $ dep_time      : int [1:336776] 517 533 542 544 554 554 555 557 557 558 ...
##  $ sched_dep_time: int [1:336776] 515 529 540 545 600 558 600 600 600 600 ...
##  $ dep_delay     : num [1:336776] 2 4 2 -1 -6 -4 -5 -3 -3 -2 ...
##  $ arr_time      : int [1:336776] 830 850 923 1004 812 740 913 709 838 753 ...
##  $ sched_arr_time: int [1:336776] 819 830 850 1022 837 728 854 723 846 745 ...
##  $ arr_delay     : num [1:336776] 11 20 33 -18 -25 12 19 -14 -8 8 ...
##  $ carrier       : chr [1:336776] "UA" "UA" "AA" "B6" ...
##  $ flight        : int [1:336776] 1545 1714 1141 725 461 1696 507 5708 79 301 ...
##  $ tailnum       : chr [1:336776] "N14228" "N24211" "N619AA" "N804JB" ...
##  $ origin        : chr [1:336776] "EWR" "LGA" "JFK" "JFK" ...
##  $ dest          : chr [1:336776] "IAH" "IAH" "MIA" "BQN" ...
##  $ air_time      : num [1:336776] 227 227 160 183 116 150 158 53 140 138 ...
##  $ distance      : num [1:336776] 1400 1416 1089 1576 762 ...
##  $ hour          : num [1:336776] 5 5 5 5 6 5 6 6 6 6 ...
##  $ minute        : num [1:336776] 15 29 40 45 0 58 0 0 0 0 ...
##  $ time_hour     : POSIXct[1:336776], format: "2013-01-01 05:00:00" "2013-01-01 05:00:00" ...
summary(df)
##       year          month             day           dep_time    sched_dep_time
##  Min.   :2013   Min.   : 1.000   Min.   : 1.00   Min.   :   1   Min.   : 106  
##  1st Qu.:2013   1st Qu.: 4.000   1st Qu.: 8.00   1st Qu.: 907   1st Qu.: 906  
##  Median :2013   Median : 7.000   Median :16.00   Median :1401   Median :1359  
##  Mean   :2013   Mean   : 6.549   Mean   :15.71   Mean   :1349   Mean   :1344  
##  3rd Qu.:2013   3rd Qu.:10.000   3rd Qu.:23.00   3rd Qu.:1744   3rd Qu.:1729  
##  Max.   :2013   Max.   :12.000   Max.   :31.00   Max.   :2400   Max.   :2359  
##                                                  NA's   :8255                 
##    dep_delay          arr_time    sched_arr_time   arr_delay       
##  Min.   : -43.00   Min.   :   1   Min.   :   1   Min.   : -86.000  
##  1st Qu.:  -5.00   1st Qu.:1104   1st Qu.:1124   1st Qu.: -17.000  
##  Median :  -2.00   Median :1535   Median :1556   Median :  -5.000  
##  Mean   :  12.64   Mean   :1502   Mean   :1536   Mean   :   6.895  
##  3rd Qu.:  11.00   3rd Qu.:1940   3rd Qu.:1945   3rd Qu.:  14.000  
##  Max.   :1301.00   Max.   :2400   Max.   :2359   Max.   :1272.000  
##  NA's   :8255      NA's   :8713                  NA's   :9430      
##    carrier              flight       tailnum             origin         
##  Length:336776      Min.   :   1   Length:336776      Length:336776     
##  Class :character   1st Qu.: 553   Class :character   Class :character  
##  Mode  :character   Median :1496   Mode  :character   Mode  :character  
##                     Mean   :1972                                        
##                     3rd Qu.:3465                                        
##                     Max.   :8500                                        
##                                                                         
##      dest              air_time        distance         hour      
##  Length:336776      Min.   : 20.0   Min.   :  17   Min.   : 1.00  
##  Class :character   1st Qu.: 82.0   1st Qu.: 502   1st Qu.: 9.00  
##  Mode  :character   Median :129.0   Median : 872   Median :13.00  
##                     Mean   :150.7   Mean   :1040   Mean   :13.18  
##                     3rd Qu.:192.0   3rd Qu.:1389   3rd Qu.:17.00  
##                     Max.   :695.0   Max.   :4983   Max.   :23.00  
##                     NA's   :9430                                  
##      minute        time_hour                  
##  Min.   : 0.00   Min.   :2013-01-01 05:00:00  
##  1st Qu.: 8.00   1st Qu.:2013-04-04 13:00:00  
##  Median :29.00   Median :2013-07-03 10:00:00  
##  Mean   :26.23   Mean   :2013-07-03 05:22:54  
##  3rd Qu.:44.00   3rd Qu.:2013-10-01 07:00:00  
##  Max.   :59.00   Max.   :2013-12-31 23:00:00  
## 
# Hepsinin icinde oldugu ornek bir calisma

df %>% 
  select(dep_delay, day, carrier) %>%
  filter(dep_delay > 10) %>%
  group_by(carrier) %>%
  summarise(ucus_sayisi = n(),
            ortalama = mean(dep_delay))

1.Degisken Secim İslemleri

select()

# Veri seti icerisinden degisken secme : select fonks.ilk arguman olarak veri setini daha sonra ise secilecek olan degisken isimleri girilir.

select(df, carrier, flight, tailnum)
# Aralik belirterekte degisken secebiliriz.
select(df, carrier, origin:hour)
# Sayiya indeksleyerek degisken secme
select(df, 1:4)
# Gorunmesini istemedigimiz degiskenin basina - koyarak secim yapabiliriz.
select(df, -carrier)
# Birden fazla degiskeni disarida bırakmak istersek eger
select(df, -c(tailnum, carrier))
# Aralik belirtererkte birden fazla degiskeni disarida birakabiliriz.
select(df, -c(origin:hour))

Veri seti icerisindeki degiskenlerden sadece bizim istedigimiz isim ya da ifadeyi barindiran degiskenleri secmek istedigimizde onları veri setinde aratarak erisebiliriz.

contains()

select(df, contains("time"))  # icerisinde time gecen degiskenler

starts_with()

select(df, starts_with("dep")) 

ends_with()

select(df, ends_with("delay"))

num_range()

m <- matrix(1:25, 5, 5)
colnames(m) <- paste("x",1:5, sep ="")

select(as.data.frame(m), num_range("x",1:3))
# dplyr fonksiyonlarinin birinci argumanlari dataframe'den olusman zorunda oldugundan dolayı m matrisine cevirme islemi uyguladik.
# Hem degisken isimleri ile hemde bir fonksiyon ile degisken secimi yapabiliriz.

select(df, carrier, tailnum, contains("time"))

2. Gozlem Islemleri

filter()

filter(df, year == 2013 & month  == 2 & day == 26)
filter(df, dep_delay > 1000)
filter(df, dep_delay > mean(df$dep_delay, na.rm = TRUE) + sd(df$dep_delay, na.rm = TRUE)) # gecikme zamani ortalamasi ile standart sapma degerinin toplamindan buyuk olan gecikme zamani gozlem degerleri

arrange()

# arrange() fonksiyonu gozlemleri belirtildigi sirada kucukten buyuge ya da buyukten kucuge siralamaya yaramaktadir.

a <- select(df, dep_delay, month, day)  # degisken secme ve atama yapma

arrange(a, dep_delay, month, day)  # kucukten buyuge
b <- arrange(a, desc(dep_delay), month, day) # buyukten kucuge

c <- filter(b, dep_delay > 0)
# Yukarida tek tek atama ile gerceklestirdigimiz islemleri pipe/chain operatoru (%>%) ile gerceklestirebiliriz.

df %>%
  filter(month == 2, day ==18) %>%
  select(dep_delay, month) %>%
  arrange(desc(dep_delay),month)

sample_frac()

# Belirli bir oranda rastgele degisken secimi yapmaktadir.Yerine koyma veya koymama durumu belirtilebilir.

df %>% sample_frac(0.05)

sample_n()

# Yine rastgele secim yapmaktadir fakat belirtilen bir deger vardir.

df %>% sample_n(100)

slice()

# Pozisyona gore secim imkani saglamaktadir.

df %>% slice(199:299)

top_n()

# İlk n degiskeni secmek icin kullanilmaktadir.

df %>% top_n(5)
## Selecting by time_hour

3. Degisken Donusum Islemleri

mutate()

# Mutate() fonksyionu yeni bir degisken olusturmaya yaramaktadir.Mutate() fonksiyonun ilk argumani veri seti, daha sonra olusturulacak olan yeni degiskenin adinin ne oldugu ve nasıl olacagı ifade edilmelidir.

sample <- df %>%
  sample_n(1000) %>%
  select(arr_delay, dep_delay, distance, arr_time)

# Ornek olarak bir senaryo dusunelim.Kalkıs olarak eksi konumda bulunan yani gec kalkmıs olan bir pilotun varıs zamani arti konumda ise bu kazanci hesap eden (varis zamani - kalkis zamani) bir degiskeni yok.Bunu olusturdugumuz dusenelim.Diger bir yandan ucaklarin hizini da hesaplamak istedigimiz dusunelim.(uzaklık / varis_zamani * 60)

mutate(sample,
       kazanc = arr_delay - dep_delay,
       hiz = distance / arr_time * 60)

rename()

# mutate() fonksiyonunu kullanmadan yeni bir degisken olusturarak isim vermeden de isimlendirme yapabiliriz.

rename(df, 
       varis_gecikmesi = arr_delay,
       kalkis_gecikmesi = dep_delay)

transmute()

# Yeni bir degisken olustururken eski degiskenleri gormek istemiyorsak bu durumda transmute fonksiyonu kallanilir.

transmute(sample,
       kazanc = arr_delay - dep_delay,
       hiz = distance / arr_time * 60)

4. Gruplama: group_by()

# Verimiz icerisindeki kategorik degiskenlere gore veriyi gruplamak icin kullanilmaktadir.Ornegin; cinsiyet,il vb.

df %>% group_by(carrier) %>%
  summarise(ucus_sayi = n(),
            ortalama_gecikme = mean(dep_delay, na.rm = TRUE),
            medyan = median(dep_delay, na.rm = TRUE),
            standart_sapma = sd(dep_delay, na.rm = TRUE),
            varyans = var(dep_delay, na.rm = TRUE),
            ortalama_uzaklik = mean(distance, na.rm = TRUE))

5. Veri Ozetleme

Veri ozetleme fonksiyonları genellikle gruplama fonksiyonları ile beraber kullanilmaktadir. Betimsel istatisler icin asagidaki fonksiyonlar ihtiyac durumuna gore kullanilmaktadir.

. summarise()

. mean(), median(), sum(), sd(), var()

. first(), last(), nth()

. quantile(), min(), max()

6. Join Islemleri

left_join()

righ_join()

inner_join()

full_join()

7. Tidy Data (Duzenli Veri)

library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.0.5
## -- Attaching packages --------------------------------------- tidyverse 1.3.1 --
## v ggplot2 3.3.3     v purrr   0.3.4
## v tibble  3.1.1     v stringr 1.4.0
## v tidyr   1.1.3     v forcats 0.5.1
## v readr   1.4.0
## Warning: package 'tibble' was built under R version 4.0.5
## Warning: package 'tidyr' was built under R version 4.0.5
## Warning: package 'readr' was built under R version 4.0.5
## Warning: package 'purrr' was built under R version 4.0.5
## Warning: package 'stringr' was built under R version 4.0.5
## Warning: package 'forcats' was built under R version 4.0.5
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
table1  # duzenli veri
table2  # duzensiz veri
table3  # duzensiz veri - rate degiskeni olusturulmus(cases / population)
table4a # duzensiz veri - yıl degerleri degisken ismi haline donusmus
table4b # duzensiz veri 

gathering ve spreading

gathering

# Getirmesini istedigimiz yani toplamak istediğimiz degiskenleri ifade ediyoruz. key degeri ile bu degiskenlere isim atamasi yapiyoruz ve daha sonra gozlem degerleri hangi degiskene ait ise onu belirtiyoruz.

table4a %>% gather(`1999`,`2000`, key = "year", value = "cases")
# yillarin altına dusen degerler population degerlerini gostermektedir.Bır onceki ornek tabloda oldugu gibi yillar degisken haline gelmis. Simdi bu durumu duzenli hale getirecegiz.

table4b %>% gather(`1999`,`2000`, key = "year", value = "population")
# Join islemlerine ornek olmasi icin iki tabloyu birlestirecegiz.

tidy_a <- table4a %>% gather(`1999`,`2000`, key = "year", value = "cases")

tidy_b <- table4b %>% gather(`1999`,`2000`, key = "year", value = "population")

left_join(tidy_a, tidy_b)
## Joining, by = c("country", "year")

spreading

# gather() fonksiyonun tersidir.Oncekinde degisken isimlerinde degiskenlerin degerleri vardır.Burada ise satirlarda degiskenkenlerin kendileri var ve yanlarindan bu degiskenlerin degerleri var.

# Gitmesini istedigimiz degisken ismini key degerine, degerlerin oldugu degisken ismini ise value kismina giriyoruz.

table2
spread(table2, key = "type", value = "count" )

seperating ve uniting

separating

# Bir degiskenin degerini iki degiskenin degeri olarak donusturulme durumundan sonra bunlari ayirmak icin kullanilir.

table3 %>%
  separate(rate, into = c("cases","population"), sep = "/", convert = TRUE)
# Yukarida ki kod kisminda table3 degerinde birlesik iki degere sahip olan rate degiskenini into kisminda ise ayirmak istedigimiz iki degiskenin isimlerini ve nasil ayirmak istedigimizi  belirttik. convert argumani ile de kendisi bu degiskenleri olasi en iyi degiskene cevirmektedir.

unite

# Var olan iki degiskenin degerlerini bir araya getirerek anlamli bir birlesme yapilmak isteniyorsa kullanilmaktadir.

table5 %>%
  unite(yil, century, year, sep = "")
# Yukarida ki kod kisminda unite fonksiyonu icerisine ilk once yeni degisken ismini, daha sonra birlestirilcek kolonları ve birlestirme seklini belirtiyoruz.